Sora Unity SDK
from ImageFlux Live Streaming
Sora Unity SDK
https://github.com/shiguredo/sora-unity-sdk
ドキュメント
https://sora-doc.shiguredo.jp/UNITY_SDK
https://github.com/shiguredo/sora-unity-sdk/blob/develop/doc/USE.md
使ってみた
https://qiita.com/stupid_student2/items/98c4242244563b728bac
WebRTCを、SFUとしてImageFluxを使うことでブラウザ<->Unityの通信を行う例
https://inside.pixiv.blog/nekomanma/7920
↑はSoraのSDKを使用していない・・・?
用語メモ
マルチストリーム
一つのピアコネクションで複数の音声や映像を動的に追加したり削除したりする仕組みです。
利用サンプル
ちょっと内容を調べてみる
接続に必要な物
シグナリングURL
シグナリングURLCandidate
チャンネルID
以下の二つはtobi使う時だけ?
tobiアクセストークン
シグナリングキー
code:InitSora()
void InitSora()
{
DisposeSora();
// sora に対して色々なイベントハンドラを登録する
sora = new Sora();
if(!MultiRecv)
{
sora.OnAddTrack = trackId => this.tranckId= trackId;
sora.OnRemoveTrack = trackId => this.trackid = 0;
} else {
sora.OnAddTrack = (trackId) => {
/*
マルチストリームだと、OnAddTrackが何度も呼び出される模様。
イベントが発火する度、このTrackIdを表示するUnityObjectをInstantiateしてる
作成したUnityObjectはthis.tracksにキャッシュ
*/
}
sora.OnRemoveTrack = (trackId) => {
// this.tracksから該当のUnityObjectを引き当ててRemove
}
}
sora.OnNotify // 謎、jsonが貰える
sora.OnPush // 謎 jsonが貰える
sora.OnHandleAudio = (buf, samples, channels) => {
// 別スレッドで動くらしい
/*
ここでもらった値を使うのは別の場所なのか、ここではQueueにEnqueueするだけ
Queue<short[]> this.audioBuffer に buf を
int this.audioBufferSamples に samples を保持する
*/
}
sora.OnMessage // 謎 stringのlabelとbyte[]のdataを受けるdataはUTF8であるとしてStringに変換してる
sora.OnDisconnect // 切断(完了?)イベントなのか、内部保持してるsoraクライアントインスタンスを破棄してる
if(unityAudioOutput) {
var audioClip = AudioClip.Create("AudioClip", 480000, 1, 480000, true, (data) => {
lock(audioBuffer) {
/*
ここで、↑で保存してた this.audioBuffer や this.audioBufferSamplesを利用する
OnHandleAudioが別スレッドで動作してるので、割り込み防止にlock構文を使ってる
*/
}
});
this.audioSourceOutput.clip = audioClip
this.audioSourceOutput.Play();
}
if(!Recvonly) {
// マイクをOnにする
AudioRenderer.Start();
audioSourceInput.Play(); // AudioListnerじゃなくてAudioSouce??? なんで?
}
}
InitSora()の中では、イベントハンドラの登録位しか無くて、実際の接続は行ってないっぽい(?)
送信側はUnityCameraしか受け付けない(RenderTextureでなく)みたいなんだけど
送信側のビデオソースを指定する Sora.SoraConfig.UnityCameraしか無くて、だめっぽい? と思ったら、SDKの機能には
Unity のカメラ映像を取得し Sora で送信
カメラから映像を取得し Sora に送信
カメラから映像を取得し Unity アプリに出力
とある
Sora.CaptureTypeには Sora.CaptureType.UnityCameraと、Sora.CaptureType.DeviceCameraの2種類がある。
DeviceCameraを使いたい時はどうすりゃいいんだ?
https://docs.unity3d.com/ja/2021.2/ScriptReference/WebCamTexture-deviceName.html
code:cs
WebCamDevice[] devices = WebCamTexture.devices;
WebCamTexture webcamTexture = new WebCamTexture();
if (devices.Length > 0)
{
webcamTexture.deviceName = devices0.name;
webcamTexture.Play();
}
って具合で、DeviceCameraの名前を取れるので、これを Sora.Config.VideCaptureDeviceに渡せばいい感じに拾ってくれ・・・るのかなぁ・・・
でもこれだと自分の絵を見る時もレンダリングして、SoraのC++層でもレンダリングしてと、ちょっとコンピュータが忙しくないかね?